﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// Summary description for EstructuracionBD
/// </summary>
public class EstructuracionBD
{

    public EstructuracionBD()
    {
    }


    public List<ActividadesEnt> RecuperarActividades()
    {
        List<ActividadesEnt> listaActividades = null;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select id,	nombre from Actividades");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaActividades = this.ObtenerActividades(dr);
            }
        }

        return listaActividades;
    }


    //Crea una lista de Actividades que devolver a partir de los datos obtenidos por
    //la consulta en SQL y la devuelve.
    private List<ActividadesEnt> ObtenerActividades(SqlDataReader dr)
    {
        List<ActividadesEnt> listaActividades = new List<ActividadesEnt>();

        int colId = dr.GetOrdinal("ID");
        int colNombre = dr.GetOrdinal("Nombre");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            string nombre = (string)valores[colNombre];

            listaActividades.Add(new ActividadesEnt(id, nombre));
        }

        return listaActividades;
    }


    public List<IteracionEnt> RecuperarIteraciones()
    {
        List<IteracionEnt> listaIteraciones = null;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select id,	nombreIteracion from Iteraciones");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaIteraciones = this.ObtenerIteraciones(dr);
            }
        }

        return listaIteraciones;
    }


    //Crea una lista de Iteraciones que devolver a partir de los datos obtenidos por
    //la consulta en SQL y la devuelve.
    private List<IteracionEnt> ObtenerIteraciones(SqlDataReader dr)
    {
        List<IteracionEnt> listaIteraciones = new List<IteracionEnt>();

        int colId = dr.GetOrdinal("ID");
        int colNombreIter = dr.GetOrdinal("nombreIteracion");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            string nombreIter = (string)valores[colNombreIter];
            
            listaIteraciones.Add(new IteracionEnt(id, nombreIter));
        }

        return listaIteraciones;
    }



    public int NumHijosProyecto ( int id ) {
        int numHijos = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("SELECT Count (DISTINCT IteracionID) AS Hijos FROM Estructuracion1 WHERE ProyectoID = @proyecto");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@proyecto", id));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();

                    int colHijos = dr.GetOrdinal("Hijos");
                   
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    numHijos = (int)valores[colHijos];
                }
            }
        }

        return numHijos;
    }


    public int NumHijosIteracion ( int idProy, int idIter ) {
        int numHijos = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("SELECT Count (DISTINCT ActividadID) AS Hijos FROM Estructuracion1 WHERE ProyectoID = @proyecto AND IteracionID = @iteracion");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@proyecto", idProy));
            cmd.Parameters.Add(new SqlParameter("@iteracion", idIter));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();

                    int colHijos = dr.GetOrdinal("Hijos");
                   
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    numHijos = (int)valores[colHijos];
                }
            }
        }

        return numHijos;
    }


    public int NumHijosActividad ( int idProy, int idIter, int idAct ) {
        int numHijos = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("SELECT Count (DISTINCT TareaID) AS Hijos FROM Estructuracion1 WHERE ProyectoID = @proyecto AND IteracionID = @iteracion AND ActividadID = @actividad");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@proyecto", idProy));
            cmd.Parameters.Add(new SqlParameter("@iteracion", idIter));
            cmd.Parameters.Add(new SqlParameter("@actividad", idAct));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();

                    int colHijos = dr.GetOrdinal("Hijos");
                   
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    numHijos = (int)valores[colHijos];
                }
            }
        }

        return numHijos;
    }


    public int NumHijosTarea(int idProy, int idIter, int idAct, int idTar)
    {
        int numHijos = 0;

        string consulta = "SELECT COUNT (DISTINCT EntregableID) AS Hijos FROM Estructuracion2 e2 WHERE e2.ProyectoID = @proyecto ";
        consulta += "AND e2.IteracionID = @iteracion AND e2.ActividadID = @actividad AND e2.TareaID = @tarea";
        
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@proyecto", idProy));
            cmd.Parameters.Add(new SqlParameter("@iteracion", idIter));
            cmd.Parameters.Add(new SqlParameter("@actividad", idAct));
            cmd.Parameters.Add(new SqlParameter("@tarea", idTar));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();

                    int colHijos = dr.GetOrdinal("Hijos");
                   
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);

                    numHijos = (int)valores[colHijos];
                }
            }
        }

        return numHijos;
    }

    //-----Iteraciones-----------------------------------------------------

    public List<IteracionEnt> RecuperarIteraciones(int proyectoId)
    {
        List<IteracionEnt> listaIteraciones = null;
        string consulta = "SELECT DISTINCT estr.IteracionId AS elID, it.NombreIteracion AS elNom From Estructuracion1 ";
        consulta += "estr , Iteraciones it Where estr.ProyectoId = @idProyecto And estr.IteracionId = it.Id";
        
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaIteraciones = this.DarmeIteraciones(dr);
            }
        }

        return listaIteraciones;
    }


    private List<IteracionEnt> DarmeIteraciones(SqlDataReader dr)
    {
        List<IteracionEnt> listaIteraciones = new List<IteracionEnt>();

        int colId = dr.GetOrdinal("elID");
        int colNombre = dr.GetOrdinal("elNom");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = Convert.ToInt32(valores[colId]);
            string nombre = valores[colNombre].ToString();

            listaIteraciones.Add(new IteracionEnt(id, nombre));
        }

        return listaIteraciones;
    }

    //---------Actividades--------------------------------------------------------


    public List<ActividadesEnt> RecuperarActividades(int proyectoId, int iteracionId)
    {
        List<ActividadesEnt> listaActividades = null;
        string consulta = " Select DISTINCT estr.ActividadId AS elID, act.Nombre AS elNom From Estructuracion1 estr, Iteraciones it";
        consulta += ", Actividades act Where estr.ProyectoId = @idProyecto And estr.IteracionId = @idIteracion ";
        consulta += "And estr.ActividadId = act.Id";

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));
            cmd.Parameters.Add(new SqlParameter("@idIteracion", iteracionId));
            

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaActividades = this.DarmeActividades(dr);
            }
        }

        return listaActividades;
    }


    private List<ActividadesEnt> DarmeActividades(SqlDataReader dr)
    {
        List<ActividadesEnt> listaActividades = new List<ActividadesEnt>();

        int colId = dr.GetOrdinal("elID");
        int colNombre = dr.GetOrdinal("elNom");
        
        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id =  Convert.ToInt32(valores[colId]);
            string nombre = valores[colNombre].ToString();

            listaActividades.Add(new ActividadesEnt(id, nombre));
        }

        return listaActividades;
    }


    //--------Tareas------------------------------------------

    public List<TareasEnt> RecuperarTareas(int proyectoId, int iteracionId, int actividadId)
    {
        List<TareasEnt> listaTareas = null;
        string consulta = "Select DISTINCT estr.TareaId AS elID, tar.Nombre AS elNom, estr.FechaAsignacion AS fAsig, estr.FechaLimite AS fechLim, estr.Estado AS est From Estructuracion1 estr, Iteraciones it,";
            consulta += "Actividades act, Tareas tar Where estr.ProyectoId = @idProyecto And estr.IteracionId";
            consulta += " = @idIteracion And estr.ActividadId = @idActividad And estr.TareaId = tar.Id";

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));
            cmd.Parameters.Add(new SqlParameter("@idIteracion", iteracionId));
            cmd.Parameters.Add(new SqlParameter("@idActividad", actividadId));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaTareas = this.DarmeTareas(dr);
            }
        }

        return listaTareas;
    }


    private List<TareasEnt> DarmeTareas(SqlDataReader dr)
    {
        List<TareasEnt> listaTareas = new List<TareasEnt>();

        int colId = dr.GetOrdinal("elID");
        int colNombre = dr.GetOrdinal("elNom");
        int colFeAsig = dr.GetOrdinal("fAsig");
        int colFeLim = dr.GetOrdinal("fechLim");
        int colEst = dr.GetOrdinal("est");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = Convert.ToInt32(valores[colId]);
            string nombre = (valores[colNombre]).ToString();
            DateTime fechaAsignacion = (!DBNull.Value.Equals(valores[colFeAsig])) ? Convert.ToDateTime(valores[colFeAsig]) : DateTime.Today;
            DateTime fechaLimite = (!DBNull.Value.Equals(valores[colFeLim])) ? Convert.ToDateTime(valores[colFeLim]) : DateTime.Today;
            string estado = valores[colEst].ToString();

            listaTareas.Add(new TareasEnt(id, nombre, fechaAsignacion, fechaLimite, estado));
        }

        return listaTareas;
    }

    //--------------Entregable-----------------------------

    public List<EntregablesEnt> RecuperarEntregables(int proyectoId, int iteracionId, int actividadId, int tareaId)
    {
        List<EntregablesEnt> listaEntregables = null;
 
        string consulta = "SELECT DISTINCT estruc.EntregableId AS elID, ent.Nombre AS elNom, estruc.FechaAsignacion AS fAsig, estruc.FechaLimite AS fechLim, ";
        consulta += "estruc.Estado AS est FROM Estructuracion2 estruc, Iteraciones it, Actividades act, Tareas tar, Entregables ent ";
        consulta+= "WHERE estruc.ProyectoId = @idProyecto AND estruc.IteracionId = @idIteracion AND estruc.ActividadId = @idActividad ";
        consulta += "AND estruc.TareaId = @idTarea AND estruc.EntregableID = ent.Id";

        
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));
            cmd.Parameters.Add(new SqlParameter("@idIteracion", iteracionId));
            cmd.Parameters.Add(new SqlParameter("@idActividad", actividadId));
            cmd.Parameters.Add(new SqlParameter("@idTarea", tareaId));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaEntregables = this.DarmeEntregables(dr);
            }
        }

        return listaEntregables;
    }


    private List<EntregablesEnt> DarmeEntregables(SqlDataReader dr)
    {
        List<EntregablesEnt> listaEntregables = new List<EntregablesEnt>();

        int colId = dr.GetOrdinal("elID");
        int colNombre = dr.GetOrdinal("elNom");
        int colFeAsig = dr.GetOrdinal("fAsig");
        int colFeLim = dr.GetOrdinal("fechLim");
        int colEst = dr.GetOrdinal("est");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = Convert.ToInt32(valores[colId]);
            string nombre = (valores[colNombre]).ToString();
            DateTime fechaAsignacion = (!DBNull.Value.Equals(valores[colFeAsig])) ? Convert.ToDateTime(valores[colFeAsig]) : DateTime.Today;
            DateTime fechaLimite = (!DBNull.Value.Equals(valores[colFeLim])) ? Convert.ToDateTime(valores[colFeLim]) : DateTime.Today;
            string estado = valores[colEst].ToString();

            listaEntregables.Add(new EntregablesEnt(id, nombre, fechaAsignacion, fechaLimite, estado));
        }

        return listaEntregables;
    }

    //--------------Empleado-----------------------------

    public EmpleadosEnt RecuperarEmpleado(int proyectoId, int iteracionId, int actividadId, int tareaId, int entregableId)
    {
        EmpleadosEnt empleado = null;

        string consulta = "SELECT DISTINCT estruc.cedulaEmpleado AS elID, emp.Nombre AS elNom ";
        consulta += "FROM Estructuracion2 estruc, Iteraciones it, Actividades act, Tareas tar, Entregables ent, Empleados emp ";
        consulta += "WHERE estruc.ProyectoId = @idProyecto AND estruc.IteracionId = @idIteracion  AND estruc.ActividadId = @idActividad ";
        consulta += "AND estruc.TareaId = @idTarea AND estruc.EntregableId = @idEntregable AND estruc.cedulaEmpleado = emp.cedula";
        
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));
            cmd.Parameters.Add(new SqlParameter("@idIteracion", iteracionId));
            cmd.Parameters.Add(new SqlParameter("@idActividad", actividadId));
            cmd.Parameters.Add(new SqlParameter("@idTarea", tareaId));
            cmd.Parameters.Add(new SqlParameter("@idEntregable", entregableId));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                empleado = this.DarmeEmpleado(dr);
            }
        }

        return empleado;
    }


    private EmpleadosEnt DarmeEmpleado(SqlDataReader dr)
    {
        EmpleadosEnt empleado = new EmpleadosEnt();

        int colId = dr.GetOrdinal("elID");
        int colNombre = dr.GetOrdinal("elNom");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = Convert.ToInt32(valores[colId]);
            string nombre = valores[colNombre].ToString();

            empleado.Cedula = id;
            empleado.Nombre = nombre;
        }

        return empleado;
    }
	
	
	public int ObtenerUltimoIdIteracion()
    {
        int resultado = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand("Select max(id) as ID from Iteraciones");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();
                    int colId = dr.GetOrdinal("Id");
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);
                    resultado = (int)valores[colId];
                }
            }
        }
        return resultado;
    }

    public bool InsertarEstructuracion1(EstructuracionEnt estrucuturacion)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Estructuracion1 (proyectoId,iteracionId,actividadId,tareaId,fechaAsignacion,estado) values(@proyectoId,@iteracionId,@actividadId,@tareaId,@fechaAsignacion,@estado)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametro correspondientes a datos de la tarea
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estrucuturacion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estrucuturacion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estrucuturacion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@tareaId", estrucuturacion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estrucuturacion.FechaAsignacion1));
                cmd.Parameters.Add(new SqlParameter("@estado", estrucuturacion.Estado1));
                cmd.ExecuteNonQuery();
            }
        }
       catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }


        return resultado;  
    }




    public bool InsertarEstructuracion2(EstructuracionEnt estrucuturacion)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de insercion a ejecutar
                SqlCommand cmd = new SqlCommand("Insert Estructuracion2 (proyectoId,iteracionId,actividadId,tareaId,entregableId, cedulaEmpleado,fechaAsignacion,estado) values(@proyectoId,@iteracionId,@actividadId,@tareaId,@entregableId,@empleadoId,@fechaAsignacion,@estado)");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametro correspondientes a datos de la tarea
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estrucuturacion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estrucuturacion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estrucuturacion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@tareaId", estrucuturacion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@entregableId", estrucuturacion.IdsEntregables));
                cmd.Parameters.Add(new SqlParameter("@empleadoId", estrucuturacion.IdsEmpleados));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estrucuturacion.FechaAsignacion2));
                cmd.Parameters.Add(new SqlParameter("@estado", estrucuturacion.Estado2));
                cmd.ExecuteNonQuery();
            }


        }

        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }
        return resultado;
    }

    public List<IteracionEnt> ConsultarIteracion(int id)
    {
        List<IteracionEnt> resultado = null;
        string consulta = "Select Id, NombreIteracion, PFGarmus, PFAlbrecht, CJAlbrecht, CJGarmus, PFSAAlbrecht,";
        consulta += " PFSAGarmus, ISBGAlbrecht, ISBGGarmus, ProductividadActual, Garmus, Albrecht from Iteraciones where id = @id";

        //utilizo conection string para conectarme
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();
            //Declaracion del comando a ejecutar

            SqlCommand cmd =
                new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@id", id)); //especificacion del parametro
            //Para consultar
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                resultado = this.ObtenerIteracion(dr); //obtengo la entidad de empleado
            }
        }
        return resultado;
    }

    public int InsertarIteracion(IteracionEnt iteracion)
    {
        int resultado = 0;

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            //Declaro el comando de insercion a ejecutar
            SqlCommand cmd = new SqlCommand("Insert Iteraciones (NombreIteracion,pfGarmus,pfAlbrecht,CJAlbrecht,CJGarmus,PFSAAlbrecht,PFSAGarmus,ISBGAlbrecht,ISBGGarmus,ProductividadActual,Garmus,Albrecht)values (@NombreIteracion,0,0,0,0,0,0,0,0,0,0,0) select @@IDENTITY Id");
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            //agrego todos los parametro correspondientes a datos de la tarea
            cmd.Parameters.Add(new SqlParameter("@NombreIteracion", iteracion.NombreIter));

            cmd.ExecuteNonQuery();

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (dr.HasRows)
                {
                    dr.Read();
                    int colId = dr.GetOrdinal("Id");
                    object[] valores = new object[dr.FieldCount];
                    dr.GetValues(valores);
                    resultado = Convert.ToInt32(valores[colId]);
                }
            }
        }

        return resultado;
    }

    private List<IteracionEnt> ObtenerIteracion(SqlDataReader dr)
    {
        List<IteracionEnt> resultado = new List<IteracionEnt>(); ;

        int colId = dr.GetOrdinal("Id");
        int colNombreIter = dr.GetOrdinal("NombreIteracion");
        int colPFGarmus = dr.GetOrdinal("PFGarmus");
        int colPFAlbrecht = dr.GetOrdinal("PFAlbrecht");
        int colCJAlbrecht = dr.GetOrdinal("CJAlbrecht");
        int colCJGarmus = dr.GetOrdinal("CJGarmus");
        int colPFSAAlbrecht = dr.GetOrdinal("PFSAAlbrecht");
        int colPFSAGarmus = dr.GetOrdinal("PFSAGarmus");
        int colISBGAlbrecht = dr.GetOrdinal("ISBGAlbrecht");
        int colISBGGarmus = dr.GetOrdinal("ISBGGarmus");
        int colProductividadActual = dr.GetOrdinal("ProductividadActual");
        int colGarmus = dr.GetOrdinal("Garmus");
        int colAlbrecht = dr.GetOrdinal("Albrecht");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            String nombreIter = (valores[colNombreIter]).ToString();
            double pFGarmus = (double)valores[colPFGarmus];
            double pFAlbrecht = (double)valores[colPFAlbrecht];
            double cJAlbrecht = (double)valores[colCJAlbrecht];
            double cJGarmus = (double)valores[colCJGarmus];
            double pfsaAlbrecht = (double)valores[colPFSAAlbrecht];
            double pfsaGarmus = (double)valores[colPFSAGarmus];
            double isbgaAlbrecht = (double)valores[colISBGAlbrecht];
            double isbgGarmus = (double)valores[colISBGGarmus];
            double prodActual = (double)valores[colProductividadActual];
            double garmus = (double)valores[colGarmus];
            double albrecht = (double)valores[colAlbrecht];

            resultado.Add(new IteracionEnt(id, nombreIter, pfsaAlbrecht, pfsaGarmus, pfsaAlbrecht, pFGarmus, cJAlbrecht, 
                                            isbgaAlbrecht, albrecht, cJGarmus, isbgGarmus, garmus, prodActual));
        }

        return resultado; //devuelvo la lista
    }

    public bool ActualizarIteraciones(List<IteracionEnt> iteraciones)
    {
        bool resultado = true;
        string consulta = "Update Iteraciones set pfGarmus=@pfGarmus,pfAlbrecht=@pfAlbrecht,CJAlbrecht=@CJGarmus,CJGarmus=@CJGarmus,";
        consulta+= "PFSAAlbrecht=@PFSAAlbrecht,PFSAGarmus=@PFSAGarmus,ISBGAlbrecht=@ISBGAlbrecht,ISBGGarmus=@ISBGGarmus,";
        consulta+= "ProductividadActual=@ProductividadActual,Garmus=@Garmus,Albrecht=@Albrecht where Id=@Id";
        int listSize = iteraciones.Count;
    
        try
        {
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                for (int i = 0; i < listSize; i++)
                {
                    SqlCommand cmd = new SqlCommand(consulta);
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.Text;
                    //agrego los parametros a la consulta
                    cmd.Parameters.Add(new SqlParameter("@Id", iteraciones[i].Id));
                    cmd.Parameters.Add(new SqlParameter("@pfGarmus", iteraciones[i].PfGarmus));
                    cmd.Parameters.Add(new SqlParameter("@pfAlbrecht", iteraciones[i].PfAlbrecht));
                    cmd.Parameters.Add(new SqlParameter("@CJAlbrecht", iteraciones[i].CasperJonesAlb));
                    cmd.Parameters.Add(new SqlParameter("@CJGarmus", iteraciones[i].CasperJonesGar));
                    cmd.Parameters.Add(new SqlParameter("@PFSAAlbrecht", iteraciones[i].PfsaAlbrecht));
                    cmd.Parameters.Add(new SqlParameter("@PFSAGarmus", iteraciones[i].PfsaGarmus));
                    cmd.Parameters.Add(new SqlParameter("@ISBGAlbrecht", iteraciones[i].IsbgAlb));
                    cmd.Parameters.Add(new SqlParameter("@ISBGGarmus", iteraciones[i].IsbgGar));
                    cmd.Parameters.Add(new SqlParameter("@ProductividadActual", iteraciones[i].ProductividadReal));
                    cmd.Parameters.Add(new SqlParameter("@Garmus", iteraciones[i].Garmus));
                    cmd.Parameters.Add(new SqlParameter("@Albrecht", iteraciones[i].Albrecht));
                    cmd.ExecuteNonQuery();
                }
            }

        }
        catch
        {
            resultado = false;
        }
        return resultado;
    }


    public List<IteracionEnt> ConsultarIteraciones(int proyectoId)
    {
        List<IteracionEnt> listaIteraciones = null;
        string consulta = "SELECT DISTINCT it.Id, it.NombreIteracion, it.PFGarmus, it.PFAlbrecht, it.CJAlbrecht, it.CJGarmus, it.PFSAAlbrecht,";
        consulta += " it.PFSAGarmus, it.ISBGAlbrecht, it.ISBGGarmus, it.ProductividadActual, it.Garmus, it.Albrecht ";
        consulta += "From Estructuracion1 estr, Iteraciones it Where estr.ProyectoId = @idProyecto And estr.IteracionId = it.Id";

        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            SqlCommand cmd = new SqlCommand(consulta);
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add(new SqlParameter("@idProyecto", proyectoId));

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                listaIteraciones = this.EncapsularIteraciones(dr);
            }
        }

        return listaIteraciones;
    }

     public bool ActualizarIteraciones(EstructuracionEnt estructuracion, int iteracionID)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("Update Estructuracion1 set IteracionID=@IteracionID, fechaAsignacion = @fechaAsignacion Where IteracionID = @IteracionIDViejo ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@IteracionId", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@IteracionIdViejo", iteracionID));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estructuracion.FechaAsignacion1));

                cmd.ExecuteNonQuery();
            }
        }
        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

        return resultado;

    }

    public bool ActualizarActividades(EstructuracionEnt estructuracion, int ActividadID)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("Update Estructuracion1 set ActividadID=@ActividadID, fechaAsignacion = @fechaAsignacion Where ActividadID = @ActividadIDViejo And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@ActividadIdViejo", ActividadID));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estructuracion.FechaAsignacion1));

                cmd.ExecuteNonQuery();
            }
        }
        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }

       
        return resultado;
    }


	public bool ActualizarTareas(EstructuracionEnt estructuracion, int TareaID)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("Update Estructuracion1 set TareaID=@TareaID, fechaAsignacion = @fechaAsignacion Where tareaID = @TareaIdVieja And ActividadID = @ActividadID And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@tareaId", estructuracion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@tareaIdVieja", TareaID));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estructuracion.FechaAsignacion1));

                cmd.ExecuteNonQuery();
            }

        }

        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }
        return resultado;
    }


    public bool ActualizarEntregables(EstructuracionEnt estructuracion, int EntregableID)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("Update Estructuracion2 set EntregableID=@EntregableID, fechaAsignacion = @fechaAsignacion Where EntregableID = @EntregableIDViejo  And TareaID = @TareaID And  ActividadID = @ActividadID And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@tareaId", estructuracion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@EntregableIdViejo", EntregableID));
                cmd.Parameters.Add(new SqlParameter("@EntregableId", estructuracion.IdsEntregables));
                cmd.Parameters.Add(new SqlParameter("@fechaAsignacion", estructuracion.FechaAsignacion1));
              


                cmd.ExecuteNonQuery();
            }

        }

        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }
        return resultado;
    }

    public bool ActualizarEmpleados(EstructuracionEnt estructuracion)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("Update Estructuracion2 set cedulaEmpleado = @cedulaEmpleado Where EntregableID = @EntregableID And  tareaID = @TareaID And ActividadID = @ActividadID And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@proyectoId", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@iteracionId", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@actividadId", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@tareaId", estructuracion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@EntregableId", estructuracion.IdsEntregables));
                cmd.Parameters.Add(new SqlParameter("@cedulaEmpleado", estructuracion.IdsEmpleados));

                cmd.ExecuteNonQuery();
            }

        }

        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }
        return resultado;
    }

    private List<IteracionEnt> EncapsularIteraciones(SqlDataReader dr)
    {
        List<IteracionEnt> listaIteraciones = new List<IteracionEnt>();

        int colId = dr.GetOrdinal("Id");
        int colNombre = dr.GetOrdinal("NombreIteracion");
        int colPFGarmus = dr.GetOrdinal("PFGarmus");
        int colPFAlbrecht = dr.GetOrdinal("PFAlbrecht");
        int colCJAlbrecht = dr.GetOrdinal("CJAlbrecht");
        int colCJGarmus = dr.GetOrdinal("CJGarmus");
        int colPFSAAlbrecht = dr.GetOrdinal("PFSAAlbrecht");
        int colPFSAGarmus = dr.GetOrdinal("PFSAGarmus");
        int colISBGAlbrecht = dr.GetOrdinal("ISBGAlbrecht");
        int colISBGGarmus = dr.GetOrdinal("ISBGGarmus");
        int colProductividadActual = dr.GetOrdinal("ProductividadActual");
        int colGarmus = dr.GetOrdinal("Garmus");
        int colAlbrecht = dr.GetOrdinal("Albrecht");

        object[] valores = new object[dr.FieldCount];

        while (dr.Read())
        {
            dr.GetValues(valores);

            int id = (int)valores[colId];
            string nombre = valores[colNombre].ToString();
            double pFGarmus = (!DBNull.Value.Equals(valores[colPFGarmus])) ? Convert.ToDouble(valores[colPFGarmus]) : 0;
            double pFAlbrecht = (!DBNull.Value.Equals(valores[colPFAlbrecht])) ? Convert.ToDouble(valores[colPFAlbrecht]) : 0;
            double cJAlbrecht = (!DBNull.Value.Equals(valores[colCJAlbrecht])) ? Convert.ToDouble(valores[colCJAlbrecht]) : 0;
            double cJGarmus = (!DBNull.Value.Equals(valores[colCJGarmus])) ? Convert.ToDouble(valores[colCJGarmus]) : 0;
            double pFSAAlbrecht = (!DBNull.Value.Equals(valores[colPFSAAlbrecht])) ? Convert.ToDouble(valores[colPFSAAlbrecht]) : 0;
            double pFSAGarmus = (!DBNull.Value.Equals(valores[colPFSAGarmus])) ? Convert.ToDouble(valores[colPFSAGarmus]) : 0;
            double iSBGAlbrecht = (!DBNull.Value.Equals(valores[colISBGAlbrecht])) ? Convert.ToDouble(valores[colISBGAlbrecht]) : 0;
            double iSBGGarmus = (!DBNull.Value.Equals(valores[colISBGGarmus])) ? Convert.ToDouble(valores[colISBGGarmus]) : 0;
            double productividadActual = (!DBNull.Value.Equals(valores[colProductividadActual])) ? Convert.ToDouble(valores[colProductividadActual]) : 0;
            double garmus = (!DBNull.Value.Equals(valores[colGarmus])) ? Convert.ToDouble(valores[colGarmus]) : 0;
            double albrecht = (!DBNull.Value.Equals(valores[colAlbrecht])) ? Convert.ToDouble(valores[colAlbrecht]) : 0;

   
            listaIteraciones.Add(new IteracionEnt(id, nombre, pFSAAlbrecht, pFSAGarmus, pFAlbrecht, pFGarmus, cJAlbrecht,
                                                    iSBGAlbrecht, albrecht, cJGarmus, iSBGGarmus, garmus, productividadActual));
        }

        return listaIteraciones;
    }
	
	    //elimina la Tarea de la base de datos, recibe la estructuracion1
    public bool EliminarEstructuracion1(EstructuracionEnt estructuracion)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Estructuracion1 Where tareaID = @TareaId And ActividadID = @ActividadID And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@TareaID", estructuracion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@ActividadID", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@IteracionID", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@ProyectoID", estructuracion.IdProyecto));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }
	
	public bool ActualizarIteracion(int idIteracion, string nombre)
    {
        bool resultado = true;
        try
        {	//me conecto a traves de connection string
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();

                //Declaro el comando de actualizacion a ejecutar
                SqlCommand cmd = new SqlCommand("update iteraciones set NombreIteracion = @NombreIteracion where Id = @Id");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                //agrego todos los parametros correspondientes a datos de la estructuracion
                cmd.Parameters.Add(new SqlParameter("@Id", idIteracion));
                cmd.Parameters.Add(new SqlParameter("@NombreIteracion", nombre));   

                cmd.ExecuteNonQuery();
            }

        }

        catch //si no se pudo conectar  o hubo un error devuelve falso en el insertar
        {
            resultado = false;
        }
        return resultado;
    }

    public void EliminarIteracionesTemporales()
    {
        using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
        {
            cnn.Open();

            //Declaro el comando de insercion a ejecutar
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cnn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "BorrarIteraciones";
            cmd.ExecuteNonQuery();
        }
    }
	
    //elimina el entregable de la base de datos, recibe la estructuracion2
    public bool EliminarEstructuracion2(EstructuracionEnt estructuracion)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Estructuracion2 Where entregableID = @entregableID And tareaID = @TareaId And ActividadID = @ActividadID And IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@TareaID", estructuracion.IdsTareas));
                cmd.Parameters.Add(new SqlParameter("@ActividadID", estructuracion.IdsActividades));
                cmd.Parameters.Add(new SqlParameter("@IteracionID", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@ProyectoID", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@entregableID", estructuracion.IdsEntregables));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }
    //elimina el entregable de la base de datos, recibe la estructuracion2
    public bool EliminarEstructuracionIt(EstructuracionEnt estructuracion)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Estructuracion1 Where  IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@IteracionID", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@ProyectoID", estructuracion.IdProyecto));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }


    //elimina el entregable de la base de datos, recibe la estructuracion2
    public bool EliminarEstructuracionAct(EstructuracionEnt estructuracion)
    {
        bool resultado = true;
        try
        {	//me conecto utilizando la conection string establecida
            using (SqlConnection cnn = new SqlConnection(ConexionBD.cnnStr))
            {
                cnn.Open();
                //Declaracion del comando de eliminacion
                SqlCommand cmd = new SqlCommand("Delete from Estructuracion1 Where  ActividadID = @ActividadID and IteracionID = @IteracionID And ProyectoID = @ProyectoID");
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@IteracionID", estructuracion.IdsIteracion));
                cmd.Parameters.Add(new SqlParameter("@ProyectoID", estructuracion.IdProyecto));
                cmd.Parameters.Add(new SqlParameter("@ActividadID", estructuracion.IdsActividades));
                cmd.ExecuteNonQuery();
            }

        }
        catch
        {
            resultado = false; //devuelva falso si no se logra conectar o hubo un error
        }

        return resultado;
    }


}
